package leetcode.editor.cn;

//给定一个整数 n ，你需要找到与它最近的回文数（不包括自身）。 
//
// “最近的”定义为两个整数差的绝对值最小。 
//
// 示例 1: 
//
// 
//输入: "123"
//输出: "121"
// 
//
// 注意: 
//
// 
// n 是由字符串表示的正整数，其长度不超过18。 
// 如果有多个结果，返回最小的那个。 
// 
// Related Topics 数学 字符串 👍 103 👎 0

import java.util.Arrays;

//Java：寻找最近的回文数
public class FindTheClosestPalindrome_564{
    public static void main(String[] args) {
        Solution solution = new FindTheClosestPalindrome_564().new Solution();
        // TO TEST
        System.out.println(solution.nearestPalindromic("2147483646"));
    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String nearestPalindromic(String n) {
        int len=n.length();
        if(len==1){ //个位数
            return String.valueOf(n.charAt(0)-'0'-1);
        }
        // 1000，10001
        if(Long.parseLong(n)==(long)(Math.pow(10,len-1)) ||Long.parseLong(n)==(long)(Math.pow(10,len-1))+1){
            return String.valueOf((long)(Math.pow(10,len-1))-1);
        }
        // 999
        if(Long.parseLong(n)==(long)(Math.pow(10,len))-1){
            return String.valueOf((long)(Math.pow(10,len))+1);
        }
        int middle = (len+1)/2;
        StringBuffer left = new StringBuffer(n.substring(0,middle));
        String[] result = new String[3];
        for (int i = 0; i < 3; i++) {
            long left1 = Long.parseLong(left.toString())+i-1;
            String right = new StringBuffer(String.valueOf(left1)).reverse().toString();
            if(len%2==1) right = right.substring(1);
            result[i] = left1+right;
        }
        long ori = Long.parseLong(n), minDelta=Integer.MAX_VALUE;
        int selected=-1;
        for (int i = 0; i < 3; i++) {
            long delta = Math.abs(ori-Long.parseLong(result[i]));
            //System.out.println(result[i]+"   "+delta);
            if(delta!=0 && delta<minDelta){
                minDelta =delta;
                selected = i;
            }
        }
        return String.valueOf(result[selected]);
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
